package QianFeng11.Singleton;

import java.io.Serializable;

/**
 * 单例模式优化
 * 1、使用同步保正线程安全synchronized
 * 2、使用volatile关键字
 * volatile提醒编译器它后面所定义的变量随时都有可能改变，因此编译后的程序每次需要存储或读
 * 取这个变量的时候，都会直接从变量地址中读取数据。如果没有volatile关键字，则编译器可
 * 能优化读取和存储，可能暂时使用寄存器中的值，如果这个变量由别的程序更新了的话，将
 * 出现不一致的现象。
 * 3、防止反射调用私有构造方法
 * 4、让单例类序例化安全
 **/
//懒汉式
public class Singleton implements Serializable {//导入接口是单例类序列化安全
    //加入volatile关键字保证变量的一致性
    private volatile static Singleton singleton = null;
    //防止反射调用私有方法
    private Singleton() {
        if (singleton != null) {
            throw new RuntimeException("此类对象为单例模式，已经被实例化了");
        }
    }

    //解决多线程访问不安全的问题
    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}
